﻿using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Collections;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace Financial.Componentes
{

    ///<summary>
    ///Controle TextBox. Além das características do TextBox da Microsoft,  
    ///terá a propriedade de máscara.
    ///</summary>   
    [ToolboxData("<{0}:TextBox runat=server></{0}:TextBox>")]
    public partial class TextBox : System.Web.UI.WebControls.TextBox, INamingContainer
    {
        private const String TIPO_SEPARADOR_MILHAR_PADRAO = ".";
        private const String TIPO_SEPARADOR_DECIMAL_PADRAO = ",";
        private const String TIPO_SEPARADOR_DATA_PADRAO = "/";
        private const Int16 QUANTIDADE_CASAS_DECIMAIS_PADRAO = 2;

        public enum EnumTextBoxType
        {
            Default,
            Cep,
            Cnpj,
            Data,
            DiaMes,
            MesAno,
            Telefone,
            TelefoneSemPais,
            TelefoneSemDdd,
            Valor
        }

        public System.Web.UI.WebControls.TextBox txtField;

        #region Atributos Privados

        //Atributos do TextBox
        private EnumTextBoxType textBoxType;
        private int heightFieldTextBox;
        private int widthFieldTextBox;

        #endregion

        #region Métodos que retornam as expressões regulares
        // <summary>
        // Método que retorna a expressão regular de CEP
        // </summary>
        // <returns></returns>
        // <remarks>
        // <para>Última alteração por: </para>
        // <para>Data: </para>
        // <para>Alteração: </para>
        // </remarks>
        private string RetornaExpressaoRegularCEP
        {
            get
            {
                //'Expressão regular de CEP
                return @"/^((\d{1})|(\d{2})|(\d{2}\.)|(\d{2}\.\d{1}|\d{3})|(\d{2}\.\d{2}|\d{4})|(\d{2}\.\d{3}|\d{5})|(\d{2}\.\d{3}-|\d{5}-)|(\d{2}\.\d{3}-\d{1}|\d{6}|\d{5}-\d{1}|\d{2}\.\d{4})|(\d{2}\.\d{3}-\d{2}|\d{7}|\d{5}-\d{2}|\d{2}\.\d{5})|(\d{2}\.\d{3}-\d{3}|\d{8}|\d{5}-\d{3}|\d{2}\.\d{6}))$/";
            }
        }

        // <summary>
        // Método que retorna a expressão regular de CNPJ
        // </summary>
        // <returns></returns>
        // <remarks>
        // <para>Última alteração por: </para>
        // <para>Data: </para>
        // <para>Alteração: </para>
        // </remarks>
        private string RetornaExpressaoRegularCNPJ
        {
            get
            {
                //'Expressão regular de Cnpj            
                return @"/^((\d{1})|(\d{2})|(\d{2}\.)|(\d{2}\.\d{1}|\d{3})|(\d{2}\.\d{2}|\d{4})|(\d{2}\.\d{3}|\d{5})|(\d{2}\.\d{3}\.|\d{5}\.)|(\d{2}\.\d{3}\.\d{1}|\d{6}|\d{5}\.\d{1}|\d{2}\.\d{4})|(\d{2}\.\d{3}\.\d{2}|\d{7}|\d{5}\.\d{2}|\d{2}\.\d{5})|(\d{2}\.\d{3}\.\d{3}|\d{8}|\d{5}\.\d{3}|\d{2}\.\d{6})|(\d{2}\.\d{3}\.\d{3}\/|\d{8}\/|\d{5}\.\d{3}\/|\d{2}\.\d{6}\/)|(\d{2}\.\d{3}\.\d{3}\/\d{1}|\d{9}|\d{5}\.\d{3}\/\d{1}|\d{2}\.\d{6}\/\d{1}|\d{2}\.\d{7}|\d{2}\.\d{3}\.\d{4}|\d{8}\/\d{1}|\d{5}\.\d{4})|(\d{2}\.\d{3}\.\d{3}\/\d{2}|\d{10}|\d{5}\.\d{3}\/\d{2}|\d{2}\.\d{6}\/\d{2}|\d{2}\.\d{8}|\d{2}\.\d{3}\.\d{5}|\d{8}\/\d{2}|\d{5}\.\d{5})|(\d{2}\.\d{3}\.\d{3}\/\d{3}|\d{11}|\d{5}\.\d{3}\/\d{3}|\d{2}\.\d{6}\/\d{3}|\d{2}\.\d{9}|\d{2}\.\d{3}\.\d{6}|\d{8}\/\d{3}|\d{5}\.\d{6})|(\d{2}\.\d{3}\.\d{3}\/\d{4}|\d{12}|\d{5}\.\d{3}\/\d{4}|\d{2}\.\d{6}\/\d{4}|\d{2}\.\d{10}|\d{2}\.\d{3}\.\d{7}|\d{8}\/\d{4}|\d{5}\.\d{7})|(\d{2}\.\d{3}\.\d{3}\/\d{4}-|\d{12}-|\d{5}\.\d{3}\/\d{4}-|\d{2}\.\d{6}\/\d{4}-|\d{2}\.\d{10}-|\d{2}\.\d{3}\.\d{7}-|\d{8}\/\d{4}-|\d{5}\.\d{7}-)|(\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{1}|\d{13}|\d{2}\.\d{11}|\d{5}\.\d{8}|\d{8}\/\d{5}|\d{12}-\d{1}|\d{2}\.\d{3}\.\d{8}|\d{2}\.\d{6}\/\d{5}|\d{2}\.\d{10}-\d{1}|\d{5}\.\d{3}\/\d{5}|\d{5}\.\d{7}-\d{1}|\d{8}\/\d{4}-\d{1}|\d{2}\.\d{6}\/\d{4}-\d{1}|\d{5}\.\d{3}\/\d{4}-\d{1}|\d{2}\.\d{3}\.\d{3}\/\d{5}|\d{2}\.\d{3}\.\d{7}-\d{1})|(\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}|\d{14}|\d{2}\.\d{12}|\d{5}\.\d{9}|\d{8}\/\d{6}|\d{12}-\d{2}|\d{2}\.\d{3}\.\d{9}|\d{2}\.\d{6}\/\d{6}|\d{2}\.\d{10}-\d{2}|\d{5}\.\d{3}\/\d{6}|\d{5}\.\d{7}-\d{2}|\d{8}\/\d{4}-\d{2}|\d{2}\.\d{6}\/\d{4}-\d{2}|\d{5}\.\d{3}\/\d{4}-\d{2}|\d{2}\.\d{3}\.\d{3}\/\d{6}|\d{2}\.\d{3}\.\d{7}-\d{2}))$/";
            }
        }

        // <summary>
        // Método que retorna a expressão regular de CPF
        // </summary>
        // <returns></returns>
        // <remarks>
        // <para>Última alteração por: </para>
        // <para>Data: </para>
        // <para>Alteração: </para>
        // </remarks>
        private string RetornaExpressaoRegularCPF
        {
            get
            {
                //Expressão regular de Cpf
                return @"/^((\d{1})|(\d{2})|(\d{3})|(\d{3}\.)|(\d{3}\.\d{1}|\d{4})|(\d{3}\.\d{2}|\d{5})|(\d{3}\.\d{3}|\d{6})|(\d{3}\.\d{3}\.|\d{6}\.)|(\d{3}\.\d{3}\.\d{1}|\d{7}|\d{6}\.\d{1}|\d{3}\.\d{4})|(\d{3}\.\d{3}\.\d{2}|\d{8}|\d{6}\.\d{2}|\d{3}\.\d{5})|(\d{3}\.\d{3}\.\d{3}|\d{9}|\d{6}\.\d{3}|\d{3}\.\d{6})|(\d{3}\.\d{3}\.\d{3}-|\d{9}-|\d{6}\.\d{3}-|\d{3}\.\d{6}-)|(\d{3}\.\d{3}\.\d{3}-\d{1}|\d{10}|\d{6}\.\d{3}-\d{1}|\d{3}\.\d{6}-\d{1}|\d{3}\.\d{7}|\d{3}\.\d{3}\.\d{4}|\d{9}-\d{1}|\d{6}\.\d{4})|(\d{3}\.\d{3}\.\d{3}-\d{2}|\d{11}|\d{6}\.\d{3}-\d{2}|\d{3}\.\d{6}-\d{2}|\d{3}\.\d{8}|\d{3}\.\d{3}\.\d{5}|\d{9}-\d{2}|\d{6}\.\d{5}))$/";
            }
        }

        // <summary>
        // Método que retorna a expressão regular de Data
        // </summary>
        // <returns></returns>
        // <remarks>
        // <para>Última alteração por: </para>
        // <para>Data: </para>
        // <para>Alteração: </para>
        // </remarks>
        private string RetornaExpressaoRegularData
        {
            get
            {
                //'Expressão regular de data
                //'OBS: No exemplo acima o separador é / o que é representado por \/ na expressão 
                //'     regular, porém quem determinará o separador é a propriedade 
                //'     TipoSeparadorData e será refletida na expressão da seguinte 
                //'     forma: "...\" & CtipoSeparadorData & "..."
                return @"/^(([0-3])|(0[1-9]|[1-2][0-9]|3[0-1])|((0[1-9]|[1-2][0-9]|3[0-1])\" + tipoSeparadorData + @")|((0[1-9]|[1-2][0-9]|3[0-1])(\" + tipoSeparadorData + @"[0-1]|[0-1]))|((0[1-9]|[1-2][0-9]|3[0-1])(\" + tipoSeparadorData + @"(0[1-9]|1[0-2])|(0[1-9]|1[0-2])))|((0[1-9]|[1-2][0-9]|3[0-1])(\" + tipoSeparadorData + @"(0[1-9]|1[0-2])|(0[1-9]|1[0-2]))\" + tipoSeparadorData + @")|((0[1-9]|[1-2][0-9]|3[0-1])(\" + tipoSeparadorData + @"(0[1-9]|1[0-2])|(0[1-9]|1[0-2]))(\" + tipoSeparadorData + @"\d{1}|\d{1}))|((0[1-9]|[1-2][0-9]|3[0-1])(\" + tipoSeparadorData + @"(0[1-9]|1[0-2])|(0[1-9]|1[0-2]))(\" + tipoSeparadorData + @"\d{2}|\d{2}))|((0[1-9]|[1-2][0-9]|3[0-1])(\" + tipoSeparadorData + @"(0[1-9]|1[0-2])|(0[1-9]|1[0-2]))(\" + tipoSeparadorData + @"\d{3}|\d{3}))|((0[1-9]|[1-2][0-9]|3[0-1])(\" + tipoSeparadorData + @"(0[1-9]|1[0-2])|(0[1-9]|1[0-2]))(\" + tipoSeparadorData + @"\d{4}|\d{4})))$/";
            }
        }

        /// <summary>
        /// Método que retorna a expressão regular de Dia Mês
        /// </summary>
        /// <returns></returns>
        /// <remarks>
        /// <para>Última alteração por: </para>
        /// <para>Data: </para>
        /// <para>Alteração: </para>
        /// </remarks>
        private String RetornaExpressaoRegularDiaMes
        {
            get
            {
                //Expressão regular de mês ano
                //OBS: No exemplo acima o separador é / o que é representado por \/ na expressão 
                //     regular, porém quem determinará o separador é a propriedade 
                //     TipoSeparadorData e será refletida na expressão da seguinte 
                //     forma: "...\" & CtipoSeparadorData & "..."
                return @"/^(([0-3])|(0[1-9]|[1-2][0-9]|3[0-1])|((0[1-9]|[1-2][0-9]|3[0-1])\" + tipoSeparadorData + @")|((0[1-9]|[1-2][0-9]|3[0-1])(\" + tipoSeparadorData + @"[0-1]|[0-1]))|((0[1-9]|[1-2][0-9]|3[0-1])(\" + tipoSeparadorData + @"(0[1-9]|1[0-2])|(0[1-9]|1[0-2]))))$/";
            }
        }

        // <summary>
        // Método que retorna a expressão regular de Mês Ano
        // </summary>
        // <returns></returns>
        // <remarks>
        // <para>Última alteração por: </para>
        // <para>Data: </para>
        // <para>Alteração: </para>
        // </remarks>
        private String RetornaExpressaoRegularMesAno
        {
            get
            {
                //Expressão regular de mês ano
                //OBS: No exemplo acima o separador é / o que é representado por \/ na expressão 
                //     regular, porém quem determinará o separador é a propriedade 
                //     TipoSeparadorData e será refletida na expressão da seguinte 
                //     forma: "...\" & CtipoSeparadorData & "..."
                return @"/^(([0-1])|(0[1-9]|1[0-2])|((0[1-9]|1[0-2])\" + tipoSeparadorData + @")|((0[1-9]|1[0-2])(\" + tipoSeparadorData + @"\d{1}|\d{1}))|((0[1-9]|1[0-2])(\" + tipoSeparadorData + @"\d{2}|\d{2}))|((0[1-9]|1[0-2])(\" + tipoSeparadorData + @"\d{3}|\d{3}))|((0[1-9]|1[0-2])(\" + tipoSeparadorData + @"\d{4}|\d{4})))$/";
            }
        }

        // <summary>
        // Método que retorna a expressão regular de Telefone
        // </summary>
        // <returns></returns>
        // <remarks>
        // <para>Última alteração por: </para>
        // <para>Data: </para>
        // <para>Alteração: </para>
        // </remarks>
        private string RetornaExpressaoRegularTelefoneSemDDD
        {
            get
            {
                //'Expressão regular de telefone
                //'Telefone com 7 números	  
                //'Telefone com 8 números
                return @"/^(((\d{1})|(\d{2})|(\d{3})|(\d{3}-)|(\d{3}-\d{1}|\d{4})|(\d{3}-\d{2}|\d{5})|(\d{3}-\d{3}|\d{6})|(\d{3}-\d{4}|\d{7}))|((\d{1})|(\d{2})|(\d{3})|(\d{4})|(\d{4}-)|(\d{4}-\d{1}|\d{5})|(\d{4}-\d{2}|\d{6})|(\d{4}-\d{3}|\d{7})|(\d{4}-\d{4}|\d{8})))$/";
            }
        }

        // <summary>
        // Método que retorna a expressão regular de Telefone sem País
        // </summary>
        // <returns></returns>
        // <remarks>
        // <para>Última alteração por: </para>
        // <para>Data: </para>
        // <para>Alteração: </para>
        // </remarks>
        private string RetornaExpressaoRegularTelefoneSemPais
        {
            get
            {
                //'Expressão regular de telefone                
                return @"/^((\d{1})|(\d{2})|(\d{3})|(\d{4})|(\d{5})|(\d{6})|(\d{6}-)|(\d{6}-\d{1}|\d{7})|(\d{6}-\d{2}|\d{8})|(\d{6}-\d{3}|\d{9})|(\d{6}-\d{4}|\d{10}))$/";
            }
        }

        // <summary>
        // Método que retorna a expressão regular de Telefone sem País
        // </summary>
        // <returns></returns>
        // <remarks>
        // <para>Última alteração por: </para>
        // <para>Data: </para>
        // <para>Alteração: </para>
        // </remarks>
        private string RetornaExpressaoRegularTelefone
        {
            get
            {
                //'Expressão regular de telefone                
                return @"/^((\d{1})|(\d{2})|(\d{3})|(\d{4})|(\d{5})|(\d{6})|(\d{7})|(\d{8})|(\d{8}-)|(\d{8}-\d{1}|\d{9})|(\d{8}-\d{2}|\d{10})|(\d{8}-\d{3}|\d{11})|(\d{8}-\d{4}|\d{12}))$/";
            }
        }

        // <summary>
        // Método que retorna a expressão regular de Valor
        // </summary>
        // <returns></returns>
        // <remarks>
        // <para>Última alteração por: </para>
        // <para>Data: </para>
        // <para>Alteração: </para>
        // </remarks>
        private string RetornaExpressaoRegularValor
        {
            get
            {
                //'Expressão regular de números decimais
                //'Sem casas decimais
                //'zero                                  = (0)
                //'1 a 9 e 0 a n digitos                 = ([1-9](\d*))
                //'Com Casas decimais
                //'zero                                  = (0)
                //'zero e a virgula                      = (0\,)
                //'zero e a virgula e a
                //'quantidade de casas decimais passadas = (0\,\d{0,2})
                //'1 a 9 e 0 a n digitos                 = ([1-9](\d*))
                //'1 a 9 e 0 a n digitos e a virgula     = ([1-9](\d*)\,)
                //'1 a 9 e 0 a n digitos e a virgula e a
                //'quantidade de casas decimais passadas = ([1-9](\d*)\,\d{0,2})
                //'OBS: No exemplo acima o separador de decimal é , o que é representado por \,
                //'     na expressão regular, porém quem determinará o separador é a propriedade 
                //'     TipoSeparadorDecimal e será refletida na expressão da seguinte 
                //'     forma: "...\" & CtipoSeparadorDecimal & "..."

                //'Caso a quanntidade de casas decimais sejá zero a expressão não 
                //'permite digitar o separador
                if (qtdCasasDecimais == 0)
                {
                    return @"/^((0)|([1-9](\d*)))$/";
                }
                else
                {
                    return @"/^((0)|(0\" + tipoSeparadorDecimal + @")|(0\" + tipoSeparadorDecimal + @"\d{0," + qtdCasasDecimais + @"})|([1-9](\d*))|([1-9](\d*)\" + tipoSeparadorDecimal + @")|([1-9](\d*)\" + tipoSeparadorDecimal + @"\d{0," + qtdCasasDecimais + @"}))$/";
                }
            }
        }

        #endregion

        #region Propriedades

        private string tipoSeparadorMilhar = TIPO_SEPARADOR_MILHAR_PADRAO;

        // <summary>
        // Define qual será o separador de milhar caso a máscara escolhida seja de Valor.
        // </summary>
        // <returns></returns>
        [Bindable(true),
        Category("TextBox"),
        DefaultValue(TIPO_SEPARADOR_MILHAR_PADRAO),
        Description("Define qual será o separador de milhar caso a máscara escolhida seja de Valor.")]
        public string TipoSeparadorMilhar
        {
            get
            {
                return tipoSeparadorMilhar;
            }
            set
            {
                if (value.Trim() == string.Empty)
                    tipoSeparadorMilhar = TIPO_SEPARADOR_MILHAR_PADRAO;
                else
                    tipoSeparadorMilhar = value;
            }
        }

        private string tipoSeparadorDecimal = TIPO_SEPARADOR_DECIMAL_PADRAO;

        // <summary>
        // Define qual será o separador de decimal caso a máscara escolhida seja de Valor.
        // </summary>
        // <returns></returns>
        [Bindable(true),
        Category("TextBox"),
        DefaultValue(TIPO_SEPARADOR_DECIMAL_PADRAO),
        Description("Define qual será o separador de decimal caso a máscara escolhida seja de Valor.")]
        public string TipoSeparadorDecimal
        {
            get
            {
                return tipoSeparadorDecimal;
            }
            set
            {
                if (value.Trim() == String.Empty)
                    tipoSeparadorDecimal = TIPO_SEPARADOR_DECIMAL_PADRAO;
                else
                    tipoSeparadorDecimal = value;
            }
        }

        private Int16 qtdCasasDecimais = QUANTIDADE_CASAS_DECIMAIS_PADRAO;

        // <summary>
        // Define qual será a quantidade de casas decimais caso a máscara escolhida seja de Valor.
        // </summary>
        // <returns></returns>
        [Bindable(true),
        Category("TextBox"),
        DefaultValue(QUANTIDADE_CASAS_DECIMAIS_PADRAO),
        Description("Define qual será a quantidade de casas decimais caso a máscara escolhida seja de Valor.")]
        public Int16 QuantidadeCasasDecimais
        {
            get
            {
                return qtdCasasDecimais;
            }
            set
            {
                qtdCasasDecimais = value;
            }
        }

        private string tipoSeparadorData = TIPO_SEPARADOR_DATA_PADRAO;

        // <summary>
        // Define qual será o separador de data caso a máscara escolhida seja de Data.
        // </summary>
        // <returns></returns>
        [Bindable(true),
        Category("TextBox"),
        DefaultValue(TIPO_SEPARADOR_DATA_PADRAO),
        Description("Define qual será o separador de data caso a máscara escolhida seja de Data.")]
        public string TipoSeparadorData
        {
            get
            {
                return tipoSeparadorData;
            }
            set
            {
                if (value.Trim() == String.Empty)
                    tipoSeparadorData = TIPO_SEPARADOR_DATA_PADRAO;
                else
                    tipoSeparadorData = value;
            }
        }


        /* TextBox properties */

        [Bindable(true),
        Category("TextBox"),
        Description("Tipo do TextBox.")]
        public EnumTextBoxType Tipo
        {
            get
            {
                return textBoxType;
            }
            set
            {
                textBoxType = value;
            }
        }

        [Bindable(true),
        Description("Altura do TextBox."),
        Category("TextBox"),
        DefaultValue(20)]
        public int HeightFieldTextBox
        {
            get
            {
                return heightFieldTextBox;
            }
            set
            {
                heightFieldTextBox = value;
            }
        }

        [Bindable(true),
        Description("Largura do TextBox."),
        Category("TextBox"),
        DefaultValue(152)]
        public int WidthFieldTextBox
        {
            get
            {
                return widthFieldTextBox;
            }
            set
            {
                widthFieldTextBox = value;
            }
        }


        #endregion

        /// <summary>
        /// Constructor
        /// </summary>
        public TextBox()
        {
            heightFieldTextBox = 15;
            widthFieldTextBox = 120;
        }

        protected override void CreateChildControls()
        {
            txtField = new System.Web.UI.WebControls.TextBox();
            txtField.ID = "txt" + this.ID;
            txtField.Height = Unit.Pixel(HeightFieldTextBox);
            txtField.Width = Unit.Pixel(WidthFieldTextBox);
            txtField.CssClass = "text";


            Table lTable = new Table();
            TableRow lTableRow = new TableRow();

            TableCell tcTextBox = new TableCell();
            tcTextBox.VerticalAlign = VerticalAlign.Middle;
            tcTextBox.HorizontalAlign = HorizontalAlign.Left;
            tcTextBox.Controls.Add(txtField);

            lTableRow.Cells.Add(tcTextBox);

            lTable.CellPadding = 0;
            lTable.CellSpacing = 0;

            lTable.Rows.Add(lTableRow);

            this.Controls.Add(lTable);
        }

        protected override void Render(HtmlTextWriter pOutput)
        {
            this.EnsureChildControls();
            base.Render(pOutput);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            this.EnsureChildControls();

            String lTipoMascara = String.Empty;
            String lDescExpressao = String.Empty;
            String lTipoSeparadorMilhar = String.Empty;
            String lTipoSeparadorDecimal = String.Empty;
            String lTipoSeparadorData = String.Empty;
            Int16 lQuantidadeCasasDecimais = 0;
            String lNomeValidator = String.Empty;
            System.Text.StringBuilder lStringBuilder = new System.Text.StringBuilder();

            switch (Tipo)
            {
                case TextBox.EnumTextBoxType.Cep:
                    lTipoMascara = "cep";
                    lDescExpressao = RetornaExpressaoRegularCEP;
                    break;
                case TextBox.EnumTextBoxType.Cnpj:
                    lTipoMascara = "cnpj";
                    lDescExpressao = RetornaExpressaoRegularCNPJ;
                    break;
                case TextBox.EnumTextBoxType.Data:
                    lTipoMascara = "date";
                    lDescExpressao = RetornaExpressaoRegularData;
                    lTipoSeparadorData = tipoSeparadorData;
                    break;
                case TextBox.EnumTextBoxType.DiaMes:
                    lTipoMascara = "day_month";
                    lDescExpressao = RetornaExpressaoRegularDiaMes;
                    lTipoSeparadorData = tipoSeparadorData;
                    break;
                case TextBox.EnumTextBoxType.MesAno:
                    lTipoMascara = "month_year";
                    lDescExpressao = RetornaExpressaoRegularMesAno;
                    lTipoSeparadorData = tipoSeparadorData;
                    break;
                case TextBox.EnumTextBoxType.TelefoneSemDdd:
                    lTipoMascara = "telefonesemddd";
                    lDescExpressao = RetornaExpressaoRegularTelefoneSemDDD;
                    break;
                case TextBox.EnumTextBoxType.TelefoneSemPais:
                    lTipoMascara = "telefonesempais";
                    lDescExpressao = RetornaExpressaoRegularTelefoneSemPais;
                    break;
                case TextBox.EnumTextBoxType.Telefone:
                    lTipoMascara = "telefone";
                    lDescExpressao = RetornaExpressaoRegularTelefone;
                    break;
                case TextBox.EnumTextBoxType.Valor:
                    lTipoMascara = "money";
                    lDescExpressao = RetornaExpressaoRegularValor;
                    lTipoSeparadorMilhar = tipoSeparadorMilhar;
                    if (qtdCasasDecimais != 0)
                    {
                        lTipoSeparadorDecimal = tipoSeparadorDecimal;
                    }
                    lQuantidadeCasasDecimais = qtdCasasDecimais;
                    break;
                case TextBox.EnumTextBoxType.Default:
                    lTipoMascara = string.Empty;
                    break;
            }

            if (lTipoMascara != String.Empty)
            {
                //'Registra a chamada dos métodos no FabTextBox
                this.Attributes.Add("onFocus", "removeCaracteres(this,'" + lTipoMascara.ToString() + "','" + lTipoSeparadorMilhar.ToString() + "')");
                this.Attributes.Add("onblur", "formataCampo(this,'" + lTipoMascara + "','" + lTipoSeparadorDecimal + "','" + lTipoSeparadorMilhar + "','" + lQuantidadeCasasDecimais.ToString() + "','" + lTipoSeparadorData + "','" + lStringBuilder.ToString() + "')");
                this.Attributes.Add("onKeyPress", "javascript:return checarDigitacaoMascara(this, event," + lDescExpressao + ",'" + Tipo.ToString() + "','" + lQuantidadeCasasDecimais + "')");
                this.Attributes.Add("onPaste", "javascript:return checarColagemMascara(this, event," + lDescExpressao + ")");

                //' Registra o Javascript no cliente.
                this.RenderClientScript();
            }

        }

        /// <summary>
        /// Registra o Javascript no cliente.
        /// </summary>
        /// <remarks>
        /// <para>Última alteração por: </para>
        /// <para>Data: </para>
        /// <para>Alteração: </para>
        /// </remarks>
        private void RenderClientScript()
        {
            if (!this.Page.IsClientScriptBlockRegistered("script_mascara"))
            {
                this.Page.RegisterClientScriptBlock("script_mascara", this.GetResourceContent("Financial.Componentes.Resource.mascara.js"));
            }
        }

        /// <summary>
        /// Lê o arquivo de script
        /// </summary>
        /// <param name="resourceID">Identifica o script</param>
        /// <returns>Script</returns>
        /// <remarks>
        /// <para>Última alteração por: </para>
        /// <para>Data: </para>
        /// <para>Alteração: </para>
        /// </remarks>
        private String GetResourceContent(String resourceID)
        {
            return new System.IO.StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceID)).ReadToEnd();
        }
    }
}

